﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using SMA.GENTEv1.Dados;

namespace SMA.GENTEv1
{
    public class PessoaDemissao
    {
        #region Variaveis Membro
        private int _idDemissaoPessoa;
        private TipoDemissao _tipoDemissao;
        private Pessoa _pessoa;
        private MotivoDemissao _motivoDemissao;
        private string _justificativa;
        private string _path;
        private DateTime? _dtHomol;
        private GENTEEntities _context;
        private DataTable comboAno;
        private DataTable comboMes;
        #endregion

        #region Parametros
        public int IdDemissaoPessoa
        {
            get { return _idDemissaoPessoa; }
            set { _idDemissaoPessoa = value; }
        }

        public TipoDemissao TipoDemissao
        {
            get { return _tipoDemissao; }
            set { _tipoDemissao = value; }
        }

        public Pessoa Pessoa
        {
            get { return _pessoa; }
            set { _pessoa = value; }
        }

        public MotivoDemissao MotivoDemissao
        {
            get { return _motivoDemissao; }
            set { _motivoDemissao = value; }
        }

        public string Justificativa
        {
            get { return _justificativa; }
            set { _justificativa = value; }
        }

        public string Path
        {
            get { return _path; }
            set { _path = value; }
        }

        public DateTime? DtHomol
        {
            get { return _dtHomol; }
            set { _dtHomol = value; }
        }
        #endregion

        #region Construtores
        public PessoaDemissao()
        {
            _context = new GENTEEntities();
        }
        #endregion

        #region Métodos Privados
        private bool VerificarCadastro()
        {
            try
            {
                bool verifica = false;

                if (this._pessoa == null)
                    throw new Exception("É necessário informar um associado!");

                if (this._pessoa.IdPessoa == 0)
                    throw new Exception("É necessário informar um associado!");

                if (this._motivoDemissao == null)
                    throw new Exception("É necessário informar o motivo de desligamento!");

                if (this._motivoDemissao.IdMotivoDemissao == 0)
                    throw new Exception("É necessário informar o motivo de desligamento!");

                verifica = true;
                return verifica;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private void EstruturaComboAno()
        {
            DataColumn ano = new DataColumn();
            ano.ColumnName = "Ano";
            ano.DataType = Type.GetType("System.Int32");
            comboAno.Columns.Add(ano);
        }

        private void EstruturaComboMes()
        {
            DataColumn mes = new DataColumn();
            mes.ColumnName = "Mes";
            mes.DataType = Type.GetType("System.String");
            comboMes.Columns.Add(mes);

            DataColumn mesId = new DataColumn();
            mesId.ColumnName = "MesId";
            mesId.DataType = Type.GetType("System.Int32");
            comboMes.Columns.Add(mesId);
        }
        #endregion

        #region Métodos Públicos
        public DataTable CarregarComboAno(int _idorganizacao)
        {
            try
            {
                comboAno = new DataTable();

                EstruturaComboAno();

                int mesreajuste = 0;
                int mesestabilidade = 0;

                DateTime database;

                Organizacao organizacao = new Organizacao();
                organizacao.SelectSindicato(_idorganizacao);

                if (organizacao.IdOrganizacao == 0)
                    throw new Exception("A empresa não possui sindicato vinculado ao seu contrato. Operação cancelada!");

                database = DateTime.Parse("01/" + organizacao.DataBase.ToString() + "/" + DateTime.Now.Year.ToString());

                mesreajuste = database.Month;
                mesestabilidade = database.AddMonths(-1).Month;

                var consulta = (from pessoademissao in _context.tab_pessoa_demissao
                                join pessoa in _context.tab_pessoa on pessoademissao.tab_pessoa.Id_pessoa equals pessoa.Id_pessoa
                                join contratopessoa in _context.tab_contrato_pessoa on pessoa.Id_pessoa equals contratopessoa.tab_pessoa.Id_pessoa
                                join contrato in _context.tab_contrato on contratopessoa.tab_contrato.Id_contrato equals contrato.Id_contrato
                                join organrelacao in _context.tab_organizacao_relacao_patrocinador on contrato.tab_organizacao_relacao_patrocinador.id_organ_relacao equals organrelacao.id_organ_relacao
                                where organrelacao.tab_organizacao1.Id_organizacao == _idorganizacao
                                && organrelacao.tab_status.id_status == 1
                                && ((pessoademissao.dt_homol.Value.Month == mesreajuste) || (pessoademissao.dt_homol.Value.Month == mesestabilidade))
                                select new
                                {
                                    anodemissao = pessoademissao.dt_homol.Value.Year
                                }).Distinct();

                var listConsulta = consulta.ToList();

                DataRow registro;
                foreach (var list in listConsulta)
                {
                    registro = comboAno.NewRow();
                    registro["Ano"] = list.anodemissao;

                    comboAno.Rows.Add(registro);
                }

                return comboAno;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public DataTable CarregarComboMes(int _idorganizacao)
        {
            try
            {
                comboMes = new DataTable();

                EstruturaComboMes();

                int mesreajuste = 0;
                int mesestabilidade = 0;

                DateTime database;
                
                Organizacao organizacao = new Organizacao();
                organizacao.SelectSindicato(_idorganizacao);

                if (organizacao.IdOrganizacao == 0)
                    throw new Exception("A empresa não possui sindicato vinculado ao seu contrato. Operação cancelada!");

                database = DateTime.Parse("01/" + organizacao.DataBase.ToString() + "/" + DateTime.Now.Year.ToString());

                mesreajuste = database.Month;
                mesestabilidade = database.AddMonths(-1).Month;

                var consulta = (from pessoademissao in _context.tab_pessoa_demissao
                                join pessoa in _context.tab_pessoa on pessoademissao.tab_pessoa.Id_pessoa equals pessoa.Id_pessoa
                                join contratopessoa in _context.tab_contrato_pessoa on pessoa.Id_pessoa equals contratopessoa.tab_pessoa.Id_pessoa
                                join contrato in _context.tab_contrato on contratopessoa.tab_contrato.Id_contrato equals contrato.Id_contrato
                                join organrelacao in _context.tab_organizacao_relacao_patrocinador on contrato.tab_organizacao_relacao_patrocinador.id_organ_relacao equals organrelacao.id_organ_relacao
                                where organrelacao.tab_organizacao1.Id_organizacao == _idorganizacao
                                && organrelacao.tab_status.id_status == 1
                                && ((pessoademissao.dt_homol.Value.Month == mesreajuste) || (pessoademissao.dt_homol.Value.Month == mesestabilidade))
                                select new
                                {
                                    mesdemissao = pessoademissao.dt_homol.Value.Month
                                }).Distinct();

                var listConsulta = consulta.ToList();

                DataRow registro;
                foreach (var list in listConsulta)
                {
                    registro = comboMes.NewRow();

                    string nomemes = System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(list.mesdemissao);
                    nomemes = char.ToUpper(nomemes[0]) + nomemes.Substring(1);
                    registro["Mes"] = nomemes;
                    registro["MesId"] = list.mesdemissao;

                    comboMes.Rows.Add(registro);
                }

                return comboMes;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public List<PessoaDemissao> SelectDemitidosDataBase(int _idorganizacao, int _mes, int _ano, bool _carregaPessoa)
        {
            try
            {
                List<PessoaDemissao> listPessoaDemissao = new List<PessoaDemissao>();

                int mesreajuste = 0;
                int mesestabilidade = 0;

                DateTime database;
                if (_mes == 0)
                {
                    Organizacao organizacao = new Organizacao();
                    organizacao.SelectSindicato(_idorganizacao);

                    if (organizacao.IdOrganizacao == 0)
                        throw new Exception("A empresa não possui sindicato vinculado ao seu contrato. Operação cancelada!");

                    database = DateTime.Parse("01/" + organizacao.DataBase.ToString() + "/" + DateTime.Now.Year.ToString());
                }
                else
                {
                    database = DateTime.Parse("01/" + _mes.ToString() + "/" + DateTime.Now.Year.ToString());
                }

                mesreajuste = database.Month;
                mesestabilidade = database.AddMonths(-1).Month;

                var consulta = (from pessoademissao in _context.tab_pessoa_demissao
                                join pessoa in _context.tab_pessoa on pessoademissao.tab_pessoa.Id_pessoa equals pessoa.Id_pessoa
                                join contratopessoa in _context.tab_contrato_pessoa on pessoa.Id_pessoa equals contratopessoa.tab_pessoa.Id_pessoa
                                join contrato in _context.tab_contrato on contratopessoa.tab_contrato.Id_contrato equals contrato.Id_contrato
                                join organrelacao in _context.tab_organizacao_relacao_patrocinador on contrato.tab_organizacao_relacao_patrocinador.id_organ_relacao equals organrelacao.id_organ_relacao
                                where (organrelacao.tab_organizacao1.Id_organizacao == _idorganizacao)
                                && (organrelacao.tab_status.id_status == 1)
                                && ((pessoademissao.dt_homol.Value.Month == mesreajuste) || (pessoademissao.dt_homol.Value.Month == mesestabilidade))
                                && ((_ano != 0) ? pessoademissao.dt_homol.Value.Year == _ano : (2 == 2))
                                select new
                                {
                                    pessoademissao.Id_demissao_pessoa,
                                    pessoademissao.tab_pessoa.Id_pessoa,
                                    pessoademissao.justificativa,
                                    pessoademissao.path,
                                    pessoademissao.dt_homol
                                });

                var listConsulta = consulta.ToList();
                int[] idpessoas = new int[listConsulta.Count];
                int i = 0;

                foreach (var list in listConsulta)
                {
                    if (!idpessoas.Contains(list.Id_pessoa))
                    {
                        PessoaDemissao pessoademissao = new PessoaDemissao();
                        pessoademissao.IdDemissaoPessoa = list.Id_demissao_pessoa;

                        if (_carregaPessoa)
                            pessoademissao.Pessoa = new Pessoa(list.Id_pessoa);
                        else
                        {
                            pessoademissao.Pessoa = new Pessoa();
                            pessoademissao.Pessoa.IdPessoa = list.Id_pessoa;
                        }

                        pessoademissao.Justificativa = list.justificativa;
                        pessoademissao.Path = list.path;
                        pessoademissao.DtHomol = list.dt_homol;

                        idpessoas[i] = list.Id_pessoa;
                        i++;

                        listPessoaDemissao.Add(pessoademissao);
                    }
                }

                return listPessoaDemissao;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public void Salvar()
        {
            try
            {
                if (VerificarCadastro())
                {
                    if (this._idDemissaoPessoa == 0)
                    {
                        tab_pessoa_demissao tabPessoaDemissao = new tab_pessoa_demissao();

                        if (this._tipoDemissao != null)
                            tabPessoaDemissao.tab_tipo_demissaoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_demissao", "id_tipo_demissao", this._tipoDemissao.IdTipoDemissao);
                        else
                            tabPessoaDemissao.tab_tipo_demissaoReference.EntityKey = null;

                        tabPessoaDemissao.tab_pessoaReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_pessoa", "Id_pessoa", this._pessoa.IdPessoa);
                        tabPessoaDemissao.tab_tipo_motivo_demissaoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_motivo_demissao", "Id_motivo_demissao", this._motivoDemissao.IdMotivoDemissao);
                        tabPessoaDemissao.justificativa = this._justificativa;
                        tabPessoaDemissao.path = this._path;
                        tabPessoaDemissao.dt_homol = this._dtHomol;

                        _context.AddTotab_pessoa_demissao(tabPessoaDemissao);
                        _context.SaveChanges();
                    }
                    else
                    {
                        tab_pessoa_demissao tabPessoaDemissao = (from pessoademissao in _context.tab_pessoa_demissao
                                                                 where pessoademissao.Id_demissao_pessoa == this._idDemissaoPessoa
                                                                 select pessoademissao).First();

                        if (this._tipoDemissao != null)
                            tabPessoaDemissao.tab_tipo_demissaoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_demissao", "id_tipo_demissao", this._tipoDemissao.IdTipoDemissao);
                        else
                            tabPessoaDemissao.tab_tipo_demissaoReference.EntityKey = null;

                        tabPessoaDemissao.tab_pessoaReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_pessoa", "Id_pessoa", this._pessoa.IdPessoa);
                        tabPessoaDemissao.tab_tipo_motivo_demissaoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_motivo_demissao", "Id_motivo_demissao", this._motivoDemissao.IdMotivoDemissao);
                        tabPessoaDemissao.justificativa = this._justificativa;
                        tabPessoaDemissao.path = this._path;
                        tabPessoaDemissao.dt_homol = this._dtHomol;

                        _context.SaveChanges();
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion
    }
}
